package cn.itcast.nems.studentrecord.web.controller.b;

import cn.itcast.ic.common.bean.Page;
import cn.itcast.nems.common.BasePageRequest;
import cn.itcast.nems.journal.service.JournalTransferSuspendedService;
import cn.itcast.nems.studentrecord.bo.EditSuspendJournalParams;
import cn.itcast.nems.studentrecord.bo.SuspendClazzParams;
import cn.itcast.nems.studentrecord.bo.SuspendJournalQuery;
import cn.itcast.nems.studentrecord.dao.condition.SuspendStudentQuery;
import cn.itcast.nems.studentrecord.dto.SuspendJournalVo;
import cn.itcast.nems.studentrecord.dto.SuspendStudent;
import cn.itcast.nems.studentrecord.dto.SuspendedClazz;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * JournalTransferSuspendedController
 * <p>
 * 休学转班
 * 1. 休学班级
 * 2. 休学预览
 * 3. 休学编辑
 * 4. 休学列表
 * 5. 休学详情
 * </p>
 * <p>Date: 2023/12/06 14:00.</p>
 * <p>Author: 牛欢.</p>
 * <p>Version: 1.0.0.</p>
 * <p>Remark: None.</p>
 */
@RequiredArgsConstructor
@RestController
@RequestMapping("/b/journal/transfer/suspended")
public class JournalTransferSuspendedController {

    private final JournalTransferSuspendedService service;

    /**
     * 休学班级
     *
     * <p>
     * 根据学籍信息获取对应的休学班级
     * </p>
     *
     * @param params 学籍信息
     * @return 对应的休学班级，返回内容不会为空，
     * @throws IllegalArgumentException 如果没有查找到学籍，休学班级，会抛出断言异常，返回状态码为 4XX
     */
    @PostMapping("/clazz")
    public ResponseEntity<SuspendedClazz> suspendedClazz(@RequestBody SuspendClazzParams params) {
        return ResponseEntity.ok().body(service.suspendedClazz(params));
    }

    /**
     * 休学预览： 金额试算
     *
     * @param params 休学预览参数：学籍信息，休学时间
     * @return 休学预览信息: 课耗，冻结金额等信息，仅仅用于前端展示，不做任何持久化
     * @throws IllegalArgumentException 如果没有查找到学籍，休学班级，会抛出断言异常，返回状态码为 4XX
     */
    @PostMapping("/preview")
    public ResponseEntity<SuspendJournalVo> suspendPreview(@RequestBody EditSuspendJournalParams params) {
        return ResponseEntity.ok().body(service.suspendPreview(params));
    }

    /**
     * 创建或修改一个休学转班记录
     *
     * @param params 休学预览参数：学籍信息，休学时间。有id则修改，无id则创建
     * @return 处理之后表单状态
     * @throws IllegalArgumentException 如果没有查找到学籍，休学班级，会抛出断言异常，返回状态码为 4XX
     */
    @PostMapping("/edit")
    public ResponseEntity<SuspendJournalVo> editSuspendJournal(@RequestBody EditSuspendJournalParams params) {
        return ResponseEntity.ok().body(service.editSuspendJournal(params));
    }

    /**
     * 休学凭单详情
     *
     * @param id 休学凭单id
     * @return 休学凭单详情
     */
    @GetMapping("/{id}")
    public ResponseEntity<SuspendJournalVo> info(@PathVariable String id) {
        return ResponseEntity.ok().body(service.info(id));
    }

    /**
     * 分页查询休学转班记录
     *
     * @param queryParam 分页查询参数
     * @return 分页结果
     */
    @PostMapping("/{typeString}/page/list")
    public ResponseEntity<Page<SuspendJournalVo>> pageList(
            @RequestBody BasePageRequest<SuspendJournalQuery> queryParam,
            @PathVariable String typeString
    ) {
        return ResponseEntity.ok().body(service.pageList(queryParam));
    }

    /**
     * 休学学员列表
     *
     * @param queryParam 分页查询参数
     * @return 分页结果
     */
    @PostMapping("/{typeString}/student/page/list")
    public ResponseEntity<Page<SuspendStudent>> studentPageList(
            @RequestBody BasePageRequest<SuspendStudentQuery> queryParam,
            @PathVariable String typeString
    ) {
        return ResponseEntity.ok().body(service.studentPageList(queryParam));
    }

}
